from handle_class import *
import numpy as np
np.array
'''
class<Entity_data>：实体数据类
由handle句柄类组成，其子类可组合为更复杂的实体数据
handle属性前必须要加h_,否则初始化会失败
命名规范为:h_类名_句柄名
如何使用：
    任何Enity_data的子类，初始化完成后引用父类的init，可以实现通过构造函数修改所有参数
'''
#全部句柄
HANDLE_ALL=1
#已定义句柄
HANDLE_DEFINED=2
#未定义句柄
HANDLE_UNDEFINED=3
class Entity:
    #实例中所有句柄属性的字典
    #str:handle
    _handle_dict:dict

    #初始化(在子类的init结尾调用该方法)
    def __init__(self,*setvalue) -> None:
        self._handle_dict={}
        self.__init_handles()
        self.values(*setvalue)
    #句柄属性初始化
    def __init_handles(self):
        for k in self.__dict__.keys():
            if(type(self.__dict__[k])==handle):
                #print(k)
                h:handle=self.__dict__[k]
                h.name=k[2:]
                self._handle_dict[k[2:]]=h
            if(issubclass(type(self.__dict__[k]),Entity)):#属性为实体类，将dict加入
                e:Entity=self.__dict__[k]
                self._add_childEntity(e)
                

    #输出所有句柄信息
    def __str__(self) -> str:
        res:str=""
        for n in self.dir():
            h:handle=self.find(n)
            res+="[{}]".format(h)
        return res
    
    
        
    # #设置实体内句柄，会被添加到handle_dict中
    # def _init_handle(self,name:str)->handle:
    #     return handle(name,dic=self._handle_dict)
    
    #将本实体中所有句柄添加到另一个句柄字典中
    def _addto_fatherDict(self,fatherDict:dict):
        for k,v in self._handle_dict:
            fatherDict[k]=v
    
    #将子实体中所有句柄添加到本实体的字典中
    def _add_childEntity(self,childEntity):
        if(childEntity==None):
            return
        c:Entity=childEntity
        for k,v in c._handle_dict.items():
            self._handle_dict[k]=v
    
    #获得实例中所有句柄名
    def dir(self,mode:int=HANDLE_ALL)->list[str]:
        res:list=[]
        if(mode==HANDLE_ALL):
            res+=self._handle_dict.keys()
        else:
            defined_list=[]
            undefined_list=[]
            for k in self._handle_dict.keys():
                h:handle=self._handle_dict[k]
                if(h.value()==None):
                    undefined_list.append(k)
                else:
                    defined_list.append(k)
        if(mode==HANDLE_DEFINED):
            res=defined_list
        if(mode==HANDLE_UNDEFINED):
            res=undefined_list                
        return res 
    #获得所有句柄对象
    def handles(self,mode:int=HANDLE_ALL)->list[handle]:
        res:list[handle]=[]
        for k in self.dir(mode):
            res.append(self._handle_dict[k])
        return res
    
    #通过句柄名查找句柄对象
    def find(self,name)-> handle:
        this_handle:handle=None
        if(name==None or name not in self._handle_dict):
            return None
        this_handle=self._handle_dict[name]  
        return this_handle

    #获得或设置实体内句柄的值
    def values(self,*setvalue)->list:
        res:list=[]
        for i in range(len(self._handle_dict.keys())):
            val=None
            if(i<len(setvalue)):
                val=setvalue[i]
            res.append(self.handles()[i].value(val))
        return res
    #直接设置句柄
    def set_value(self,handle_name:str,setvlaue):
        h:handle=self._handle_dict[handle_name]
        h.value(setvlaue)
    
    def input(self,words:list[str]):
        setvalue=[]
        for i in range(len(words)):
            if(words[i]!=None):
                setvalue.append(self.handles()[i].vtype(words[i]))
            else:
                setvalue.append(None)
        self.values(*setvalue)


